/*
 *
 * Copyright (c) 2021
 * User:Dybala
 * File:AdminService.java
 * Date:2021/11/21 22:36:21
 */

package com.service;

import com.alibaba.excel.EasyExcel;
import com.dao.AdminDao;
import com.dao.LogDao;
import com.dao.TaskDao;
import com.dao.UserDao;
import com.pojo.*;
import com.utils.JwtUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class AdminService {
    @Autowired
    redisService server;
    @Autowired
    MailService mailservice;
    @Autowired
    TaskDao taskdao;
    @Autowired
    AdminDao admindao;
    @Autowired
    LogDao logdao;
    @Autowired
    UserDao userdao;
    public Message login(Admin admin,String token){
        String key="sys:admin:token" + token;
        String str = server.get(key);
        Message res=new Message();
        String sc = "";
        if(token!=null){
            sc= JwtUtils.getEmail(token);
        }
        if(str!=null&&admin.getAccount().equals(sc)){
            res.setFlag(250);
            res.setMsg("请不要重复登录");
            return res;
        }
        Admin Dadmin=null;
        Dadmin=admindao.queryByAccountAndPwd(admin);
        if(Dadmin==null){
            res.setFlag(400);
            res.setMsg("账户或密码错误");
        }else{
            //设置redis和token
            String sign = JwtUtils.sign(admin.getAccount());
            String tokenKey = "sys:admin:token" + sign;
            server.set(tokenKey,sign);
            server.expire(tokenKey,JwtUtils.EXPIRE_TIME*2);
            res.setFlag(200);
            res.setMsg(sign);
        }
        return res;
    }

    /**
     * 导出logExcel
     */
    public void exportLog(){
        List<SysLog> sysLogs = logdao.queryAll();
        String pos="D:/temp/log.xlsx";
        EasyExcel.write(pos,SysLog.class).sheet("日志列表列表").doWrite(sysLogs);
    }

    /**
     * 导出用户Excel
     */
    public void exportUser() {
        List<User> users = userdao.queryAll();
        String pos="D:/temp/user.xlsx";
        EasyExcel.write(pos,User.class).sheet("学生列表").doWrite(users);
    }

    /**
     * 冻结用户账号
     * @param email 用户邮箱
     */
    public void lockUser(String email) {
        // 需要嵌入发邮件通知
        admindao.updateUserStatus(email,"no");
        /**
         * 发邮件告知
         */
        String title="账号状态变化信息";
        String content="您的账号已被冻结，请及时在个人中心申诉账号";
        sendEmail(email,title,content);
    }

    /**
     * 解封用户账号
     * @param email 用户邮箱
     */
    public void unlockUser(String email) {
        // 需要嵌入发邮件通知
        admindao.updateUserStatus(email,"active");
        /**
         * 发邮件通知
         */
        String title="账号状态变化信息";
        String content="您的账号已经恢复正常";
        sendEmail(email,title,content);
    }

    /**
     * 删除任务
     * @param task_id 任务对应的id
     */
    public void delTask(int task_id){
        Task task = taskdao.queryAllById(task_id);
        String publisher = task.getPublisher();
        taskdao.deletePreTask(task_id);//删除了任务
        // 需要嵌入发邮件通知
        String title="任务信息发生改变";
        String content="您的任务 "+task.getId()+" :" +task.getTitle()+" 经举报已被下架\n 请合理规范自己的发帖行为";
        sendEmail(publisher,title,content);
    }

    /**
     * 一个辅助类，用于发送邮件通知
     * @param email
     * @param content
     * @param title
     */
    private void sendEmail(String email,String content,String title){
        mailservice.sendSimpleMail(email,title,content);
    }


    /**
     * 忽视此条记录，代表不处理
     * @param id 事务的唯一主键id
     */
    public void ignore(int id){
        Report report = admindao.queryReportById(id);
        String email = report.getLanucher();
        sendEmail(email,"宁的请求已被受理，请及时查看结果","处理结果");
        deleteAffairById(id);//删除了本条记录
        //向发起者发送邮件，说明原因，
    }

    public void deleteAffairById(int id){
        admindao.deleteAffairById(id);
    }

    /**
     * 根据投诉类型 （0：投诉，1：举报，2：申诉） 返回列表
     * @param type_id
     * @return
     */
    public List<Report> getReport(int type_id){
        List<Report> reports = admindao.queryAffairByType(type_id);
        return reports;
    }

    /**
     * 发布公告，返回发布结果
     * @param notice
     * @return
     */
    public Boolean publishNotice(Notice notice) {
        notice.setPublishTime(new Date());
        return admindao.publishNotice(notice);
    }

    /**
     * 删除公告，返回删除结果
     * @param nid
     * @return
     */
    public boolean delNotice(Integer nid) {
        if(admindao.delNotice(nid)>0){return true;}
        else return false;
    }


    public Map<String,Integer> initAdmin() {
        List<Report> reports = admindao.queryAffairByType(0);
        HashMap<String,Integer> map=new HashMap<>();
        map.put("count0",reports.size());
        reports=admindao.queryAffairByType(1);
        map.put("count1",reports.size());
        reports=admindao.queryAffairByType(2);
        map.put("count2", reports.size());
        return map;
    }
}
